/**
 * 
 */
package com.skivingcloud.workflow.service;

import java.util.List;
import java.util.Map;

import com.skivingcloud.admin.sys.entity.User;
import com.skivingcloud.common.utils.PageUtils;
import com.skivingcloud.workflow.entity.TaskParam;

import net.sf.json.JSONObject;

/**
 * 工作流任务相关接口
 * @author hushouquan
 *
 */
public interface LovelyTaskService {

	/**
	 * 流程提交方法
	 * @param params 参数
	 * @param user 操作人
	 * @return
	 */
	TaskParam subminTask(TaskParam params, User user);

	/**
	 * 我的待办流程
	 * @param params
	 * @param user
	 * @return
	 */
	PageUtils getToDoList(Map<String, Object> params, User user);

	/**
	 * 别人授权给自己处理的流程
	 * @param params
	 * @return
	 */
	PageUtils getAuthorizationTaskList(Map<String, Object> params);

	/**
	 * 查询当前任务节点信息
	 * @param taskId
	 * @return
	 * @throws Exception 
	 */
	Map<String, Object> getTaskNodeInfo(String taskId) throws Exception;

	/**
	 * 根据业务id查询流程处理记录
	 * @param busNo
	 * @return
	 */
	List<Map<String, Object>> getApproveHistoryByBusNo(String busNo);

	/**
	 * 根据流程实例id查询流程处理记录
	 * @param processId
	 * @return
	 */
	List<Map<String, Object>> getApproveHistoryByProcessId(String processId);

	/**
	 * 获取可退回节点
	 * @param processId
	 * @param taskDefinitionKey
	 * @param processDefinitionId
	 * @return
	 */
	List<Map<String, Object>> getRetractNode(String processId, String taskDefinitionKey, String processDefinitionId);

	/**
	 * 获取审批意见
	 * @param taskId
	 * @return
	 */
	String getApproveAdviceByTaskId(String taskId);

	/**
	 * 我参与的流程
	 * @param page
	 * @param limit
	 * @param dataForm
	 * @param userId
	 * @return
	 */
	PageUtils queryParticipationProcessList(String page, String limit, String dataForm, String userId);

	/**
	 * 我发起的流程查询
	 * @param page
	 * @param limit
	 * @param obj
	 * @param userId
	 * @return
	 * @throws Exception 
	 */
	PageUtils getCreateTaskList(int page, int limit, JSONObject obj, String userId) throws Exception;

	/**
	 * 根据流程实例获取最后一个执行节点的表单信息（用于展现动态表单的详情页面）
	 * @param processId
	 * @return
	 * @throws Exception 
	 */
	Map<String, Object> getProcessInsLastNodeInfo(String processId) throws Exception;

	/**
     * 根据流程实例id查询当前用户参与过的节点，不包含撤回和终止的节点
     * @param processid 流程实例id
     * @param user 操作用户
     * @return
     */
    List<Map<String,Object>> getCanRecallNode(String processid, User user);
    
    /**
     * 参与人撤回流程
     * @param params{'processId': 流程实例id,
     *      *  'recallNodeKey': 要撤回的节点key,
     *      *  'deleteReason': 撤回原因
     *      *  }
     * @param user
     * @param system
     */
    void recallMaster(Map<String,Object> params, User user, User system) throws Exception;
    
    /**
     * 发起人撤回
     * @param processid 流程实例id
     * @param user 操作用户
     */
    void restartByCreater(String processid, User user) throws Exception;

    /**
     * 流程查询、分页,只查询自己租户的
     * @param params
     * @param user 
     * @return
     */
	PageUtils allProcessList(Map<String, Object> params, User user);

	/**
	 * 终止流程
	 * @param processid
	 * @param deleteReason
	 * @param user
	 */
	void deleteProcess(String processid, String deleteReason, User user);

	/**
	 * 流程退回
	 * @param taskId 当前任务id
	 * @param activityDfId 退回节点
	 * @param userId 要退回节点的审批人assignee
	 * @param user 操作人
	 * @param approveAdvice 处理结果
	 * @param discicription 处理意见
	 * @param wfParam 流程变量
	 */
	void rejectTaskToOld(String taskId, String activityDfId, String userId, User user, String approveAdvice, String discicription, JSONObject wfParam);

	/**
     * 发起人撤回,根据业务主键撤回
     * @param busNo 业务主键
     * @param user 操作用户
	 * @throws Exception 
     */
	void restartByBusNo(String busNo, User user) throws Exception;

	/**
     * 根据业务id查询用户对流程的操作权限
     * @param userId 用户id
     * @param busId 业务id数组
     * @param tenantId 租户
     * @return
     */
	Map<String, Map<String, Object>> getUserDelStatusByBusKey(String userId, String[] busId, String tenantId);

	/**
     * 暂存审批意见
     * @param userId 用户id
     * @param taskId 任务id
     * @param approveAdvice 审批意见
     * @param authCatagory 是否代理
     * @param owner 授权人，authCatagory是‘1’时候
     */
	void saveApproveAdvice(String userId, String taskId, String approveAdvice, String authCatagory, String owner);

	/**
	 * 根据当前流程任务id查询流程变量
	 * 
	 * @param taskId
	 * @return
	 */
	Map<String, Object> getTaskParamByTaskId(String taskId);

	/**
	 * 指派流程处理人
	 * @param checkProcessId
	 * @param ids
	 */
	void addAssignee(String checkProcessId, List<String> ids);

	/**
	 * 获取可退回节点
	 * @param taskId
	 * @return
	 */
	List<Map<String, Object>> getRetractNodeByTaskId(String taskId);
}
